﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Sofire
{
    /// <summary>
    /// 缓冲区数据转换。
    /// </summary>
    public static class BufferConvert
    {
        /// <summary>
        /// 从指定 <paramref name="offset"/> 开始读取 4 个字节，转换成 <see cref="System.Int32"/> 类型的值。
        /// </summary>
        /// <param name="buffer">数据缓冲区。</param>
        /// <param name="offset">数据缓冲区中操作开始位置处的偏移量，以字节为单位。</param>
        /// <returns>返回一个 <see cref="System.Int32"/> 类型的值。并将 <paramref name="offset"/> 移位增加 4 字节。</returns>
        public static int ReadInt32(byte[] buffer, ref int offset)
        {
            return buffer[offset++] | (buffer[offset++] << 8) | (buffer[offset++] << 16) | (buffer[offset++] << 24);
        }

        /// <summary>
        /// 从指定 <paramref name="stream"/> 开始读取 4 个字节，转换成 <see cref="System.Int32"/> 类型的值。
        /// </summary>
        /// <param name="stream">数据流。</param>
        /// <returns>返回一个 <see cref="System.Int32"/> 类型的值。并将 <paramref name="stream"/> 移位增加 4 字节。</returns>
        public static int ReadInt32(Stream stream)
        {
            return ((byte)stream.ReadByte()) | (((byte)stream.ReadByte()) << 8) | (((byte)stream.ReadByte()) << 16) | (((byte)stream.ReadByte()) << 24);
        }

        /// <summary>
        /// 将指定  <see cref="System.Int32"/> 类型的值，写入缓冲区。并将 <paramref name="offset"/> 移位增加 4 字节。
        /// </summary>
        /// <param name="value">写入的值。</param>
        /// <param name="buffer">数据缓冲区。</param>
        /// <param name="offset">数据缓冲区中操作开始位置处的偏移量，以字节为单位。</param>
        public static void WriteInt32(int value, byte[] buffer, ref int offset)
        {
            buffer[offset++] = (byte)value;
            buffer[offset++] = (byte)(value >> 8);
            buffer[offset++] = (byte)(value >> 16);
            buffer[offset++] = (byte)(value >> 24);
        }

        /// <summary>
        /// 将指定  <see cref="System.Int32"/> 类型的值，4 字节内容写入流。
        /// </summary>
        /// <param name="value">写入的值。</param>
        /// <param name="stream">数据流。</param>
        public static void WriteInt32(int value, Stream stream)
        {
            stream.WriteByte((byte)value);
            stream.WriteByte((byte)(value >> 8));
            stream.WriteByte((byte)(value >> 16));
            stream.WriteByte((byte)(value >> 24));
        }

        /// <summary>
        /// 从指定 <paramref name="offset"/> 开始读取 8 个字节，转换成 <see cref="System.Int64"/> 类型的值。
        /// </summary>
        /// <param name="buffer">数据缓冲区。</param>
        /// <param name="offset">数据缓冲区中操作开始位置处的偏移量，以字节为单位。</param>
        /// <returns>返回一个 <see cref="System.Int64"/> 类型的值。并将 <paramref name="offset"/> 移位增加 8 字节。</returns>
        public static long ReadInt64(byte[] buffer, ref int offset)
        {
            uint num = (uint)(((buffer[offset++] | (buffer[offset++] << 8)) | (buffer[offset++] << 16)) | (buffer[offset++] << 24));
            uint num2 = (uint)(((buffer[offset++] | (buffer[offset++] << 8)) | (buffer[offset++] << 16)) | (buffer[offset++] << 24));
            return (long)((num2 << 32) | num);

        }

        /// <summary>
        /// 从指定 <paramref name="stream"/> 开始读取 8 个字节，转换成 <see cref="System.Int64"/> 类型的值。
        /// </summary>
        /// <param name="stream">数据流。</param>
        /// <returns>返回一个 <see cref="System.Int64"/> 类型的值。并将 <paramref name="stream"/> 移位增加 8 字节。</returns>
        public static long ReadInt64(Stream stream)
        {
            uint num = (uint)(((((byte)stream.ReadByte()) | (((byte)stream.ReadByte()) << 8)) | (((byte)stream.ReadByte()) << 16)) | (((byte)stream.ReadByte()) << 24));
            uint num2 = (uint)(((((byte)stream.ReadByte()) | (((byte)stream.ReadByte()) << 8)) | (((byte)stream.ReadByte()) << 16)) | (((byte)stream.ReadByte()) << 24));
            return (long)((num2 << 32) | num);

        }

        /// <summary>
        /// 将指定  <see cref="System.Int64"/> 类型的值，写入缓冲区。并将 <paramref name="offset"/> 移位增加 8 字节。
        /// </summary>
        /// <param name="value">写入的值。</param>
        /// <param name="buffer">数据缓冲区。</param>
        /// <param name="offset">数据缓冲区中操作开始位置处的偏移量，以字节为单位。</param>
        public static void WriteInt64(long value, byte[] buffer, ref int offset)
        {
            buffer[offset++] = (byte)value;
            buffer[offset++] = (byte)(value >> 8);
            buffer[offset++] = (byte)(value >> 16);
            buffer[offset++] = (byte)(value >> 24);
            buffer[offset++] = (byte)(value >> 32);
            buffer[offset++] = (byte)(value >> 40);
            buffer[offset++] = (byte)(value >> 48);
            buffer[offset++] = (byte)(value >> 56);
        }

        /// <summary>
        /// 将指定  <see cref="System.Int64"/> 类型的值，8 字节内容写入流。
        /// </summary>
        /// <param name="value">写入的值。</param>
        /// <param name="stream">数据缓冲区。</param>
        public static void WriteInt64(long value, Stream stream)
        {
            stream.WriteByte((byte)value);
            stream.WriteByte((byte)(value >> 8));
            stream.WriteByte((byte)(value >> 16));
            stream.WriteByte((byte)(value >> 24));
            stream.WriteByte((byte)(value >> 32));
            stream.WriteByte((byte)(value >> 40));
            stream.WriteByte((byte)(value >> 48));
            stream.WriteByte((byte)(value >> 56));
        }
    }
}